home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-11-06 | 1.7 KB | 92 lines | [TEXT/MSET] |
- (*
-
- A 2arraygen is a dynamically-allocated 2-dimensional array, intended to be
- used for keeping text strings. Each element has a maximum length that it
- will accept. This class was created expressly for use in class editlist,
- but it may prove useful elsewhere.
-
- Note that after instantiation we must first set the array size and the
- maximum number of characters per element with the init: message. Then we
- must send new: because memory from the heap is allocated.
-
- *)
-
-
- :class 2arrayGen super{ object }
- var #ofRows
- var #ofCols
- var elemSize
- var stride
- handle arrayData
-
- :m maxsize: ( -- n ) \ maximum number of characters for a cell
- get: elemSize 1- ;m
-
- :m init: ( #rows #cols maxSize -- )
- 1+ put: elemSize \ must allow room for count byte
- put: #ofCols
- put: #ofRows
- get: #ofCols get: elemSize * put: stride
- ;m
-
-
- :m release:
- release: arrayData ;m
-
- :m check: ( row# col# -- )
- get: #ofCols 1 - > swap
- get: #ofRows 1 - > or abort" 2arrayGen indices out of bounds." ;m
-
- :m elemAddr: { row# col# -- addr }
- row# col# check: self
- ptr: arrayData
- get: stride row# * +
- get: elemSize col# * +
- ;m
-
- :m to: { addr len row# col# \ dest -- }
- len maxSize: self min -> len
- row# col# elemAddr: self -> dest
- addr ( src) dest 1+ len cmove
- len dest c!
- ;m
-
- :m at: ( row# col# -- addr len )
- elemAddr: self dup 1+ swap c@ ;m
-
- :m clearall:
- get: #ofRows 0 ?DO
- get: #ofCols 0 ?DO
- 0 j i elemAddr: self c!
- LOOP
- LOOP ;m
-
- :m new:
- get: #ofCols get: #ofRows *
- get: elemSize *
- new: arrayData
- clearall: self ;m
-
- ;class
-
- endload
-
- *** EXAMPLE USE
-
-
- 2arrayGen gg
- 5 5 6 init: gg
- new: gg
-
- " heelofgl" 0 0 to: gg
-
- " barf" 0 1 to: gg
- " goot" 1 0 to: gg
-
- 0 0 at: gg type
- 0 1 at: gg type
- 1 0 at: gg type
-
- release: gg
-
-